package com.cskaoyan.javase.oop2._2polymorphic._0introduction;

/**
 * 什么是多态（polymorphic）呢？
 * 从字面意义上理解
 * 同一个事物，在不同的时刻/情况表现出不同的状态，就可以称之为多态。
 *
 * 在Java的多态当中，多态指的是：
 *      1.同一种事物：同一个引用（即父类的引用）
 *      2.不同的情况：指向不同的对象（不同的子类对象）
 *      只有父类引用可能指向不同的对象,不同的子类对象
 *      3.不同的状态：调用同名方法会体现出不同的行为
 * 总结来说，Java中的多态指的是
 * 同一个父类引用指向不同子类对象时，调用同名成员方法
 * 根据指向实际对象的不同，得到的行为也会随之不不同。
 * (成员方法的调用,要根据对象的具体类型来决定,而不同的子类当中,可以选择重写父类中的成员方法)
 *
 * 多态的发生条件
 * 根据上述定义，总结一下Java中多态发生的条件：
 *      1.必须存在继承，多态一定发生在父子类之间。
 *      2.必须存在方法重写，不同的子类需要重写父类中的同名方法。
 *      3.必须存在父类引用指向子类对象
 *
 * 反向总结,不能发生多态的条件:
 *      1.阻止类继承,final修饰类,final类是不能继承的,final类是不可能发生多态的
 *      2.不能重写的方法:
 *          a.private方法,包括父类中子类没有访问权限的方法
 *          b.static方法,它不属于继承,也不能重写
 *          c.构造方法,不能被继承,不能被重写
 *          d.final修饰方法,final方法是不能重写的
 *      3.父类引用指向子类对象,写代码去完成
 *
 * @since 09:25
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 同一个父类引用
        Phone p;
        // 指向不同的子类对象
        p = new IPhone();
        p.call();
        p = new HuaWeiPhone();
        p.call();
        p = new MiPhone();
        p.call();
    }
}

class Phone {
    void call() {
        System.out.println("打电话~");
    }
}

class IPhone extends Phone {
    @Override
    void call() {
        System.out.println("嘿siri,给老王打电话~");
    }
}
class HuaWeiPhone extends Phone{
    @Override
    void call() {
        System.out.println("小艺,给老马打电话~");
    }
}
class MiPhone extends Phone{
    @Override
    void call() {
        System.out.println("小爱同学,给siri打电话~");
    }
}